home *** CD-ROM | disk | FTP | other *** search
/ Gekikoh Dennoh Club 7 / Gekikoh Dennoh Club Vol. 7 (Japan).7z / Gekikoh Dennoh Club Vol. 7 (Japan) (Track 01).bin / games / otoko / source.lzh / FuncEnemy / lboss04s.c < prev    next >
C/C++ Source or Header  |  1999-06-14  |  5KB  |  213 lines

  1. /* 4面ボス左右肩 (04s = 04 sholder) */
  2. #include <xsp2lib.h>
  3.  
  4. #include "../otoko.h"
  5. #include "../player.h"
  6. #include "../enemy.h"
  7. #include "../eshot.h"
  8. #include "../effect.h"
  9. #include "../priority.h"
  10. #include "../sound.h"
  11. #include "../psearch.h"
  12.  
  13.  
  14. #define TIMER_1    10000        /* これ以上時間が経過したら自爆 */
  15.  
  16. #define SPEED_SHOT1    12    /* 1段階目扇型ショット速度 */
  17. #define SPEED_SHOT2    10    /* 2段階目伸びるショットの一番遅い弾の速度 */
  18.  
  19.  
  20. enum {
  21.     WING_LEFT = 0, WING_RIGHT
  22. };
  23.  
  24. static short EnemyMoveLBoss04S (ENEMY *);
  25. static void EnemyTiniLBoss04S (ENEMY *);
  26.  
  27.  
  28. void EnemyInitLBoss04S (ENEMY * p)
  29. {
  30.     p->vx = 0;
  31.     p->vy = 2 << 16;
  32.     p->hit_px = 24;
  33.     p->hit_py = 16;
  34.     p->hit_sx = 24;
  35.     p->hit_sy = 16;
  36.     p->hit_cx = 6;
  37.     p->timer = 0;
  38.     p->damage = 0;
  39.     p->flash = 0;
  40.     p->seq = 0;
  41.     p->func_enemy_move = EnemyMoveLBoss04S;
  42.     p->func_enemy_tini = EnemyTiniLBoss04S;
  43.  
  44.     if (p->lx < 0) {
  45.         p->cwork = WING_LEFT;    /* 左か右か */
  46.         p->pt = obj_lboss04 + 1;
  47.         p->hp = 800;
  48.         p->parts1 = EnemyInit (ENEMY_LBOSS04W, -16, 0, 0, p);    /* 左翼 */
  49.     } else {
  50.         p->cwork = WING_RIGHT;
  51.         p->pt = obj_lboss04 + 2;
  52.         p->hp = 600;    /* 実は右の方がちょっと弱い */
  53.         p->parts1 = EnemyInit (ENEMY_LBOSS04W, 16, 0, 0, p);    /* 右翼 */
  54.     }
  55. }
  56.  
  57.  
  58.  
  59. static short EnemyMoveLBoss04S (ENEMY * p)
  60. {
  61.     if ((p->child_kill) || (p->child_death))
  62.         return (-1);    /* 消去 */
  63.     p->timer++;
  64.     if (p->timer > TIMER_1) {
  65.         EffectInit (EFFECT_EXPL, 0, p->x, p->y);
  66.         SoundSetSE (SE_EXPL_M);    /* 中ボス爆発音 */
  67.         p->child_death = !0;    /* 消去準備 */
  68.     }
  69.     if (p->cwork == WING_LEFT) {
  70.         p->x = p->parent->x - 47;
  71.         p->y = p->parent->y - 31;
  72.     } else {
  73.         p->x = p->parent->x + 47;
  74.         p->y = p->parent->y - 31;
  75.     }
  76.     switch (p->seq) {
  77.     case 0:
  78.         /* 翼パーツが消えたか? */
  79.         if ((p->parts1) && (p->parts1->child_death)) {
  80.             p->parts1 = 0;    /* これ以降参照しない */
  81.             p->seq++;
  82.             p->m_work = 110;
  83.         }
  84.         break;
  85.     case 1:        /* しばらく待つ */
  86.         if (p->m_work-- <= 0) {
  87.             p->seq++;
  88.             p->s_work = p->s_work2 = p->s_work3 = 0;
  89.         }
  90.         break;
  91.  
  92.     case 2:        /* 攻撃開始 */
  93.         switch (p->s_work) {
  94.  
  95.         case 0:
  96.             p->s_work2++;
  97.             switch (p->s_work2) {
  98. #define INTERVAL0    12
  99. #define SPEED_SHOT0_1    10
  100.             case 8 + INTERVAL0 * 0:
  101.                 p->s_angle = psearch (p->x, p->y);    /* 自機の方向をサーチ */
  102.                 p->s_work4 = SPEED_SHOT0_1;
  103.             case 8 + INTERVAL0 * 1:
  104.             case 8 + INTERVAL0 * 2:
  105.             case 8 + INTERVAL0 * 3:
  106.                 /* 下に降りてきている時は攻撃をしない */
  107.                 if (p->parent->m_work < 11) {
  108.                     EshotInit (ESHOT_NRG03, p->x, p->y, p->s_work4, p->s_angle - 12, 2);
  109.                     EshotInit (ESHOT_NRG04, p->x, p->y, p->s_work4, p->s_angle, 2);
  110.                     EshotInit (ESHOT_NRG03, p->x, p->y, p->s_work4, p->s_angle + 12, 2);
  111.                     SoundSetSE (SE_ESHOT_M);    /* 敵ショット音 */
  112.                     p->s_work4 += 4;
  113.                 }
  114.                 break;
  115.             case 8 + INTERVAL0 * 6:
  116.                 p->s_work2 = 0;
  117.                 if (p->s_work3++ > 3) {
  118.                     p->s_work++;
  119.                     p->s_work3 = 0;
  120.                 }
  121.                 break;
  122.             default:
  123.                 break;
  124.             }
  125.             break;
  126.  
  127.         case 1:    /* 炸裂弾 */
  128.             p->s_work2++;
  129. #define INTERVAL1    20
  130. #define SPEED_SHOT1_1    13
  131. #define SPEED_SHOT1_2    21
  132.             if ((p->s_work2 == INTERVAL1) && (p->parent->m_work < 11)) {
  133.                 unsigned char a;
  134.                 short h;
  135.                 a = p->s_angle = psearch (p->x, p->y);    /* 自機の方向をサーチ */
  136.                 for (h = 0; h < 16; h++) {
  137.                     EshotInit (ESHOT_NRG03, p->x, p->y, SPEED_SHOT1_1, a, 4);
  138.                     a += 16;
  139.                 }
  140.                 SoundSetSE (SE_EBOMB_M);
  141.             }
  142.             if ((p->s_work2 == INTERVAL1 + 1) && (p->parent->m_work < 11)) {
  143.                 unsigned char a = p->s_angle + 8;
  144.                 short h;
  145.                 for (h = 0; h < 16; h++) {
  146.                     EshotInit (ESHOT_NRG03, p->x, p->y, SPEED_SHOT1_1, a, 2);
  147.                     a += 16;
  148.                 }
  149.             }
  150.             if ((p->s_work2 == INTERVAL1 * 2) && (p->parent->m_work < 11)) {
  151.                 unsigned char a = psearch (p->x, p->y);    /* 自機の方向をサーチ */
  152.                 short h;
  153.                 for (h = 0; h < 16; h++) {
  154.                     EshotInit (ESHOT_NRG34N, p->x, p->y, SPEED_SHOT1_2, a, 2);
  155.                     a += 16;
  156.                 }
  157.                 SoundSetSE (SE_EBOMB_L);
  158.             }
  159.             if (p->s_work2 == INTERVAL1 * 3) {
  160.                 p->s_work2 = 0;
  161.                 if (p->s_work3++ > 3) {
  162.                     p->s_work++;
  163.                     p->s_work3 = 0;
  164.                 }
  165.             }
  166.             break;
  167.         default:
  168.             p->s_work = 0;
  169.             break;
  170.         }
  171.         break;
  172.     }
  173.  
  174.  
  175.     /* 自機ショットに当たった時の処理 */
  176.     if (p->damage) {
  177.         SoundSetSE (SE_DAMAGE);
  178.         p->info = PALET_DAMAGE | PRIORITY_BOSS_PARTS;
  179.         p->damage_core = 0;
  180.         if ((p->hp -= p->damage) <= 0) {
  181.             /* 死んだ */
  182.             EffectInit (EFFECT_EXPL, 0, p->x, p->y);
  183.             EffectInit (EFFECT_POINTS_RED, POINTS_1000, p->x, p->y);
  184.             SoundSetSE (SE_EXPL_M);    /* 中ボス爆発音 */
  185.             if (disp_level == DISP_LEVEL_HIGH)
  186.                 EffectInit (EFFECT_HAHENMINI, 0, p->x, p->y);
  187.             p->child_death = !0;    /* 消去準備 */
  188.         }
  189.         p->damage = 0;
  190.         p->flash = TIMER_FLASH_DAMAGE;
  191.     } else {
  192.         if ((p->flash++ > TIMER_FLASH_RED) && (p->hp < 200)) {
  193.             p->info = PALET_RED | PRIORITY_BOSS_PARTS;
  194.             if (p->flash > TIMER_FLASH_NORMAL)
  195.                 p->flash = 0;
  196.         } else {
  197.             p->info = PALET_LBOSS04 | PRIORITY_BOSS_PARTS;
  198.         }
  199.     }
  200.     xobj_set_st (p);
  201.  
  202.     return (0);
  203. }
  204.  
  205.  
  206.  
  207. static void EnemyTiniLBoss04S (ENEMY * p)
  208. {
  209.     /* パーツが存在していたら消すように指示 */
  210.     if (p->parts1)
  211.         p->parts1->child_kill = !0;
  212. }
  213.